<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  
  <meta name="generator" content="Hugo 0.98.0" />

  
  <meta name="description" content="走在通往幸福的路上">
  

  
  <link rel="apple-touch-icon" sizes="180x180" href="https://blog.v5u.win/apple-touch-icon.png">

  
  <link rel="icon" type="image/png" sizes="32x32" href="https://blog.v5u.win/favicon-32x32.png">

  
  <link rel="icon" type="image/png" sizes="16x16" href="https://blog.v5u.win/favicon-16x16.png">

  
  <link rel="manifest" href="https://blog.v5u.win/site.webmanifest">

  
  <link rel="mask-icon" href="https://blog.v5u.win/safari-pinned-tab.svg" color="">

  <meta name="msapplication-TileColor" content="">

  <meta name="theme-color" content="">

  
  <link rel="stylesheet" href="https://blog.v5u.win/css/bootstrap.min.css" />

  
  <title>黑客与画家 | 为吾优</title>
  

  <style>
body {
  min-width: 300px;
}

.custom-navbar {
  margin-bottom: 1em;
  height: 60px;
}

.custom-navbar a {
  display: inline-block; 
  padding: 18px 0;
  margin-right: 1em; 
  font-weight: bold; 
}

.custom-navbar a:hover,
.custom-navbar a:focus {
  text-decoration: none; 
}

@media print {
  .custom-navbar {
    display: none;
  }
}

article {
  padding-bottom: 1em;
}

img {
  max-width: 100%;
}


body {
  background-color: #fff;
}



body {
  color: #212529;
}



a {
  color: #007bff;
}



a:hover,
a:focus {
  color: #0056b3;
}



.custom-navbar {
  background-color: #212529;
}



.custom-navbar a {
  color: rgba(255,255,255,.75);
}



.custom-navbar a:hover,
.custom-navbar a:focus {
  color: rgba(255,255,255,1);
}



.container {
  max-width: 800px;
}





</style>
</head>

<body>
  <nav class="custom-navbar">
  <div class="container">
    
    <a href="/">文章</a>
    
    <a href="/tags/">标签</a>
    
    <a href="/about/">关于</a>
    
    <a href="/index.xml">RSS</a>
    
  </div>
</nav>
  
  <div class="container">
    <article>
      <h1>黑客与画家</h1>
<p>
  <small class="text-secondary">
  
  
  2018-08-07
  </small>
  
</p>
<p>黑客与画家</p>
<p>保罗·格雷厄姆</p>
<p>真话</p>
<p>2018-07-16 20:44:09</p>
<p>这就是找出“不能说的话”的第一种方法：判断言论的真伪。</p>
<p>异端邪说</p>
<p>2018-07-16 20:43:24</p>
<p>我们把这种不一定正确、但是极富争议的言论称为“异端邪说”。关注“异端邪说”，是找出“不能说的话”的第二种方法。</p>
<p>时空差异</p>
<p>2018-07-16 20:42:20</p>
<p>所以，我们就有了找出“不能说的话”的第三种方法：将当代观念与不同时期的古代观念diff^一下。</p>
<p>道貌岸然</p>
<p>2018-07-16 20:49:28</p>
<p>还有第四种寻找“不能说的话”的方法：寻找那些一本正经的卫道者，看看他们到底在捍卫着什么。</p>
<p>机制</p>
<p>2018-07-16 20:52:15</p>
<p>我还想到了第五种方法，可以找出“不能说的话”，那就是去观察禁忌是如何产生的。</p>
<p>客户支持</p>
<p>2018-08-06 19:47:14</p>
<p>Viaweb的开发人员总是与客服人员保持密切联系。客服人员坐在距离程序员只有9米的地方，知道自己可以随时打断程序员的工作，提交新证实的bug的报告。遇到重大bug，我们就算在开董事会，也会马上回来修改程序。</p>
<p>目标客户</p>
<p>2018-08-07 10:19:43</p>
<p>不少公司都很想知道，什么事情可以外包，什么事情不可以外包。一个可能的答案是，公司内部所有不直接感受到竞争压力的部门都应该外包出去，让它们暴露在竞争压力之下。</p>
<p>注: 公司的那些事情可以外包？</p>
<p>创业公司</p>
<p>2018-08-07 10:39:10</p>
<p>桌面软件迫使用户变成系统管理员，互联网软件则是迫使程序员变成系统管理员：</p>
<p>为什么不尝试一下？</p>
<p>2018-08-07 11:11:10</p>
<p>如果你是一个黑客，并且梦想自己创业，可能会有两件事情令你望而却步，不敢真正开始采取行动。一件是你不懂得管理企业，另一件是你害怕竞争。可是实际上，这两件事都是没有通电的电篱笆。</p>
<p>首先，管理企业其实很简单，只要记住两点就可以了：做出用户喜欢的产品，保证开支小于收入。只要做到这两点，你就会超过大多数创业公司。随着事业的发展，你自己就能琢磨出来其他的诀窍。</p>
<p>2018-08-07 11:15:34</p>
<p>至于如何做出用户喜欢的产品，下面是一些通用规则。从制造简洁的产品开始着手，首先要保证你自己愿意使用。然后，迅速地做出1.0版，并且不断以改进，整个过程中密切倾听用户的反馈。用户总是对的，但是不同的用户要求不一样。低端的用户要求简化操作和清晰易懂，高端的用户要求你增加新功能。软件最大的好处就是让一切变得简单。但是，做到这一点的方法是正确设置默认值，而不是限制用户的选择。如果竞争对手的产品很糟糕，你也不要自鸣得意。比较软件的标准应该是看对手的软件将来会有什么功能，而不是现在有什么功能。无论何时，你都要使用自己的软件。</p>
<p>金钱不等于财富</p>
<p>2018-08-07 11:38:56</p>
<p>如果你想要创造财富（这里指的是狭义的财富，也就是使你免于饥饿的东西），那么你应该抱着特别怀疑的态度，去思考那些着眼于你自己感兴趣的东西的商业计划。对于自己感兴趣的东西，你会觉得它们很有价值，伹是它们恰恰最不可能与他人眼中有价值的东西发生重合。」</p>
<p>高科技=可放大性</p>
<p>2018-08-08 09:08:56</p>
<p>在实际操作中，这就意味着我们故意选择那些很困难的技术问题。假定软件有两个候选的新功能，它们创造的商业价值完全相同，那么我们总是选择较困难的那个功能。不是因为这个功能能带来更多的收入，</p>
<p>而是因为它比较难。我们很乐于迫使那些又大又慢的竞争对手跟着我们一起走进沼泽地。创业公司就像游击队一样，喜欢选择不易生存的深山老林作为根据地，政府的正规军无法追到那种地方。我还记得创业初期我们是多么筋疲力尽，整天都为一些可怕的技术难题绞尽脑汁。但是，我还是感到相当高兴，因为那些问题连我们都觉得这么困难，那么竞争对手就更会认为是不可能解决的。</p>
<p>2018-08-08 09:12:14</p>
<p>总的来说，这也是很好的处事原则。如果你有两个选择，就选较难的那个。如果你要选择是坐在家里看电视，还是外出跑步，那就出去跑步吧。这个方法有效的原因可能是遇到两个一难一易的选择时，往往出于懒惰的缘故，你会选择较易的那个选项。在意识深处，你其实知道不懒惰的做法会带来更好的结果，这个方法只是迫使你接受这一点。」</p>
<p>潜规则</p>
<p>2018-08-08 09:13:18</p>
<p>创业是有一些潜规则的，其中一条就是很多事情由不得你。</p>
<p>2018-08-08 09:18:20</p>
<p>另一条潜规则是，创业的付出与回报虽然总体上是成比例的，但是在个体上是不成比例的。</p>
<p>2018-08-08 09:22:23</p>
<p>那么，怎样才能把公司卖掉呢？基本上，不管是否想出售公司，你要做的事情都是一样的（比如多赚钱）。但是，被收购本身就是一门学问，我们在Viaweb花了很多时间研究它。</p>
<p>潜在的买家会尽可能地拖延收购。收购这件事最难的地方就是让买方真正拿出钱。大多数时候，促成买方掏钱的最好办法不是让买家看到有获利的可能，而是让他们感到失去机会的恐惧。对于买家来说，最强的收购动机就是看到竞争对手可能收购你。我们发现这会使得CEO们连夜行动。次强的动机则是让他们担心如果现在不买你，你的高速成长将使得未来的收购耗资巨大，甚至你本身可能变成一个他们的竞争对手。</p>
<p>2018-08-08 09:24:46</p>
<p>我认为你应该和买家一样，也把用户数量当作一个测试指标。像优化软件一样优化公司，用户数量就是判断公司表现好坏的指标。做过软件优化的人都知道，优化难点就是如何测出系统的表现。如果凭空猜测软件最慢的是哪一部分以及怎样让它快起来，那估计百分百会猜错。用户数量也许不是最好的测量指标，但应该也相差不远了。买家关心它，收入依赖它，竞争对手恐惧它，记者和潜在用户则是被它打动。无论你的技术水平有多高，用户数量都比你自己的判断更能准确反映哪些问题应该优先解决。</p>
<p>2018-08-08 09:25:19</p>
<p>此外，将公司管理视同软件优化还能帮助你避免VC担心的另一个陷阱——开发某种产品的时间过长。现在，黑客都已经熟知这一点，并总结出一个术语“过早优化”（premature optimization）。尽快拿出1.0版，然后根据用户的反映而不是自己的猜测进行软件优化。</p>
<p>你必须时刻牢记的最基本的原则就是，</p>
<p>财富和权力</p>
<p>2018-08-08 09:37:27</p>
<p>为什么欧洲在历史上变得如此强大？是因为欧洲优越的地理位置，还是因为欧洲人天生就比较优秀，或者是宗教原因？答案（或者至少是近因）可能就是欧洲人接受了一个威力巨大的新观点：允许赚到大钱的人保住自己的财富。</p>
<p>7.关注贫富分化</p>
<p>2018-08-08 10:10:18</p>
<p>与下棋、画画、写小说一样，赚钱也是一种专门的技能。但是，出于某种原因，我们以完全不同的态度对待这种技能。如果某些人善于下棋或写小说，没有人会有意见；伹是，如果某些人善与赚钱，报纸上就会有社论出来说这是不对的。</p>
<p>为什么？赚钱看上去与其他技能没有本质不同，为什么人们的反应如此强烈？</p>
<p>我认为有三个原因使得我们对赚钱另眼相看。第一，我们从小被误导的对财富的看法；第二，历史上积累财富的方式大多名声不好；第三，担心收入差距拉大将对社会产生不利影响。就我所知，第一点是错的，第二点已经过时了，第三点通不过现实的检验。有没有可能，在现代社会中，收入差距拉大实际上是一种健康的信号？</p>
<p>财富的老爹模式</p>
<p>2018-08-08 09:47:35</p>
<p>为什么财富的分配问题引起这么多争论？部分原因是反对声最大的人当中，很多人都少有创造财富的经验：大学生、继承人、教授、政客、新闻记者。（如果你在酒吧里听过大家议论体育赛事，你一定很熟悉这种现象。）</p>
<p>9.设计者的品味</p>
<p>2018-08-14 16:04:35</p>
<p>9.设计者的品味</p>
<p>2018-08-14 16:05:11</p>
<p>只要你开始思考这些问题，你就会发现，众多不同学科对“美”的认识有着惊人的相似度。优秀设计的原则是许多学科的共同原则，一再反复地出现。</p>
<p>2018-08-14 16:04:17</p>
<p>好设计是简单的设计。</p>
<p>2018-08-14 16:05:29</p>
<p>当你被迫把东西做得很简单时，你就被迫直接面对真正的问题。当你不能用表面的装饰交差时，你就不得不做好真正的本质部分。</p>
<p>2018-08-14 16:03:25</p>
<p>好设计是永不过时的设计。</p>
<p>2018-08-14 16:03:42</p>
<p>以永不过时作为目标也是一种避开时代风潮的影响的方法。</p>
<p>2018-08-14 16:04:05</p>
<p>所以，如果你的作品对今天的人们以及1500年的人都有吸引力，那么它极有可能也会吸引2500年的人。</p>
<p>2018-08-14 16:03:10</p>
<p>好设计是解决主要问题的设计。</p>
<p>2018-08-14 16:02:40</p>
<p>许多坏设计做得很辛苦，但是从一开始方向就错了。20世纪中期，有一股使用无衬线（sans-serif）字体的潮流。这一类字体接近于纯手写的样式，但是它无助于解决最主要的问题。印刷出来的文字首先应该是易于辨认的，所以能够清晰地分辨字母就是最主要的问题——传统的新罗马（Times Roman）字体是一种有衬线的字体，虽然看上去古老得就像维多利亚女王时代的风格，但是它的小写g就是可以很轻易地与小写y区分。</p>
<p>注: 关于设计</p>
<p>2018-08-14 16:07:58</p>
<p>好设计是启发性的设计。</p>
<p>2018-08-14 16:08:51</p>
<p>在建筑学和设计学中，这条原则意味着，一幢建筑或一个物品应该允许你按照自己的愿望来使用。</p>
<p>2018-08-14 16:09:21</p>
<p>在软件业中，这条原则意味着，你应该为用户提供一些基本模块，使得他们可以随心所欲自由组合，就像玩乐高积木那样。</p>
<p>2018-08-14 16:10:36</p>
<p>在数学中，这条原则意味着，一个可以成为许多新工作基础的证明要优于一个难度很高、但无助于未来学科发展的证明</p>
<p>2018-08-14 16:10:48</p>
<p>好设计通常是有点趣味性的设计。</p>
<p>2018-08-14 16:48:24</p>
<p>好设计是艰苦的设计。</p>
<p>2018-08-14 16:52:25</p>
<p>好设计是看似容易的设计。</p>
<p>2018-08-14 16:59:15</p>
<p>好设计是对称的设计。</p>
<p>2018-08-14 16:59:31</p>
<p>对称有两种：重复性对称和递归性对称。递归性对称就是指子元素的重复，比如树叶上叶脉的纹路。</p>
<p>2018-08-14 17:03:06</p>
<p>在数学和工程学中，递归尤其有用。归纳式证明方法既简洁又美妙。在软件中，能用递归解决的问题通常代表已经找到了最佳解法。</p>
<p>2018-08-14 17:03:37</p>
<p>好设计是模仿大自然的设计。</p>
<p>2018-08-14 17:06:01</p>
<p>好设计是一种再设计。</p>
<p>2018-08-14 17:08:56</p>
<p>好设计是能够复制的设计。</p>
<p>2018-08-14 17:10:09</p>
<p>好设计常常是奇特的设计。</p>
<p>2018-08-14 17:11:46</p>
<p>好设计是成批出现的。</p>
<p>2018-08-14 17:13:32</p>
<p>好设计常常是大胆的设计</p>
<p>2018-08-14 17:15:37</p>
<p>单单是无法容忍丑陋的东西还不够，只有对这个领域非常熟悉，你才可能发现哪些地方可以动手改进。你必须锻炼自己。只有在成为某个领域的专家之后，你才会听到心里有一个细微的声音说：“这样解决太糟糕了！一定有更好的选择。”不要忽视这种声音，要培育它们。优秀作品的秘块就是：非常严格的品味，再加上实现这种品味的能力。</p>
<p>注: 如何达到具有好的品味</p>
<p>面向对象编程</p>
<p>2018-08-14 18:18:37</p>
<p>事实上有两种程度的面向对象编程：某些语言允许你以这种风格编程，另一些语言则强迫你一定要这样编程。</p>
<p>2018-08-14 18:18:24</p>
<p>我觉得后一类语言不可取。允许你做某事的语言肯定不差于强迫你做某事的语言。所以，至少在这方面我们可以得到明确的结论：你应该使用允许你面向对象编程的语言。至于你最后到底用不用则是另外一个问题了。</p>
<p>11.百年后的编程语言</p>
<p>2018-08-14 18:25:02</p>
<p>我的判断是，那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净，它的生命力就越顽强。</p>
<p>2018-08-14 18:29:06</p>
<p>浪费可以分成好的浪费和坏的浪费。我感兴趣的是好的浪费，即用更多的钱得到更简单的设计。</p>
<p>2018-08-14 18:32:21</p>
<p>如果我们把一种语言的内核设想为一些基本公理的集合，那么仅仅为了提高效率就往内核添加多余的公理，却没有带来表达能力的提升，这肯定是一件很糟的事。没错，效率是很重要，但是我认为修改语言设计并不是提高效率的正确方法。</p>
<p>正确做法应该是将语言的语义与语言的实现予以分离。在语义上不需要同时存在列表和字符串，单单列表就够了。而在实现上做好编译器优化，使它在必要时把字符串作为连续字节的形式处理^。</p>
<p>^「我相信，Lisp Machine Lisp（Lisp语言的一种方言）是第一个具体表达这样一种观点的语言：变量的声明（除了动态类型变量之外）只是优化的建议，对一个正确程序本身的含义不构成影响。Common Lisp（Lisp语言的另一种方言）则好像第一个明确提出了这一点。」</p>
<p>2018-08-14 18:34:29</p>
<p>毕竟数组只是散列表的一个子集，其特点就是数组的键全部都是整数向量。进一步说，散列表本身会不会被列表取代呢？</p>
<p>2018-08-14 18:42:03</p>
<p>即使是应用程序，使用多层形式开发也是一种很强大的技巧。自下而上的编程方法意味着要把软件分成好几层，每一层都可以充当它上面那一层的开发语言。这种方法往往会产生更小、更灵活的程序。它也是通往软件圣杯——可重用性（reusability）——的最佳路线。从定义上看，语言就是可以重用的。在编程语言的帮助下，你的应用程序越是采用这种多层形式开发，它的可重用性就越好。</p>
<p>13.书呆子的复仇</p>
<p>2018-08-22 13:13:15</p>
<p>一般来说，如果你动手创造一种新语言，那是因为你觉得它在某些方面会优于现有的语言。J</p>
<p>向心力</p>
<p>2018-08-22 13:31:47</p>
<p>如果你创业的话，千万不要为了取悦风险投资商或潜在并购方而设计你的产品。让用户感到满意才是你的设计方向。只要赢得用户，其他事情就会接踵而来。如果没有用户，谁会关心你选择的“正统”技术是多么令人放心。</p>
<p>随大流的代价</p>
<p>2018-08-22 13:32:08</p>
<p>随大流的代价</p>
<p>一个诀窍</p>
<p>2018-08-22 13:44:18</p>
<p>我们就有了两点结论，我认为它们非常有价值。事实上，这是我用自己的经历换来的。第一，不同语言的编程能力不一样。第二，大多数经理故意忽视第一点。</p>
<p>附录：编程能力</p>
<p>2018-08-22 13:56:12</p>
<p>格林斯潘第十定律”（Greenspun’s Tenth Rule）：</p>
<p>任何C或Fortran程序复杂到一定程度之后，都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。</p>
<p>2018-08-22 13:56:25</p>
<p>如果你想解决一个困难的问题，关键不是你使用的语言是否强大，而是好几个因素同时发挥作用：（a）使用一种强大的语言；（b）为这个难题写一个事实上的解释器；或者（c）你自己变成这个难题的人肉编译器。在Python的例子中，这样的处理方法已经开始出现了，我们实际上就是自己写代码，模拟出编译器实现词法变量的功能。</p>
<p>2018-08-22 13:57:45</p>
<p>皮特·诺维格发现，总共23种设计模式之中，有16种在Lisp语言中“本身就提供，或者被大大简化”。（www.norvig.com/design-pattems）」</p>
<p>简洁</p>
<p>2018-08-22 14:18:04</p>
<p>简洁性最重要的方面就是要使得语言更抽象。</p>
<p>效率</p>
<p>2018-08-22 14:28:54</p>
<p>所以，编程时提高代码运行速度的关键是使用好的性能分析器（profiler），而不是使用其他方法，比如精心选择一种静态类型的编程语言。</p>
<p>时间</p>
<p>2018-08-22 14:36:56</p>
<p>，要常年累月不断地做市场推广，直到人们开始接受这种发明。我们就耗费了好几年才使得客户明白ViaWeb不需要下载安装就能使用。不过，好消息是，简单重复同一个信息就能解决这个问题。你只需要不停地重复同一句话，最终人们将会开始倾听。人们真正注意到你的时候，不是第一眼看到你站在那里，而是发现过了这么久你居然还在那里。</p>
<p>2018-08-22 14:37:38</p>
<p>新技术被市场接纳的方式有两种，一种是自然成长式，另一种是大爆炸式。自</p>
<p>再设计</p>
<p>2018-08-22 14:39:52</p>
<p>为了写出优秀软件，你必须同时具备两种互相冲突的信念。一方面，你要像初生牛犊一样，对自己的能力信心万丈；另一方面，你又要像历经沧桑的老人一样，对自己的能力抱着怀疑态度。</p>
<p>2018-08-22 14:40:26</p>
<p>你必须对解决难题的可能性保持乐观，同时对当前解法的合理性保持怀疑。</p>
<p>15.设计与研究</p>
<p>2018-08-22 16:06:07</p>
<p>设计与研究的区别看来就在于，前者追求“好”（good），后者追求“新”（new）。优秀的设计不一定很“新”，但必须是“好”的；优秀的研究不一定很“好”，但必须是“新”的。我认为这两条道路最后会发生交叉：只有应用“新”的创意和理论，才会诞生超越前人的最佳设计；只有解决那些值得解决的难题（也就是“好”的难题），才会诞生最佳研究。所以，最终来说，设计和研究都通向同一个地方，只是前进的路线不同罢</p>
<p>2018-08-22 16:10:19</p>
<p>怎么理解编程语言？你不要把它看成那些已完成的程序的表达方式，而应该把它理解成促进程序从无到有的一种媒介。这里的意思是说，成品的材料和开发时用的材料其实是不一样的。搞艺术的人都知道，这两个阶段往往需要不同的媒介。比如，大理石是一种非常良好、耐用的材料，很适合用于最后的成品，但是它极其缺乏弹性和灵活性，所以不适合在构思阶段用来做模型。</p>
<p>2018-08-22 16:16:24</p>
<p>开发软件的时候，我有一条规则：任何时候，代码都必须能够运行。</p>
<p>2018-08-22 16:17:35</p>
<p>设计意味着做出符合人类特点和需要的产品。但是，“人类”不仅包括用户，还包括设计师，所以设计工作本身也必须符合设计师的特点和需要。</p>

    </article>
  </div>

  
  
  

  
</body>

</html>